package y24.m1.homework;

import java.math.BigDecimal;
import java.math.MathContext;
public class Test1 {
    public static void main(String[] args) {
        // 定义方程
        f function = x -> BigDecimal.valueOf(2).multiply(x.pow(7))
                .add(BigDecimal.valueOf(2).multiply(x.pow(5)))
                .add(BigDecimal.valueOf(4).multiply(x.pow(4)))
                .add(BigDecimal.valueOf(80));
        // 定义方程导数
        f derivative = x -> BigDecimal.valueOf(14).multiply(x.pow(6))
                .add(BigDecimal.valueOf(10).multiply(x.pow(4)))
                .add(BigDecimal.valueOf(16).multiply(x.pow(3)));

        BigDecimal x0 = BigDecimal.valueOf(1);//初始猜测值
        BigDecimal epsilon = BigDecimal.valueOf(0.00001);//误差精度
        // 牛顿迭代法求解方程
        BigDecimal result = newtonMethod(function, derivative, x0, epsilon);
        System.out.println("方程的近似解为：" + result);
    }
    public static BigDecimal newtonMethod(f function, f derivative, BigDecimal x0, BigDecimal epsilon) {
        BigDecimal x = x0;
        BigDecimal fx = function.evaluate(x);
        while (fx.abs().compareTo(epsilon) > 0) {
            BigDecimal dx = fx.divide(derivative.evaluate(x), MathContext.DECIMAL128);
            x = x.subtract(dx);
            fx = function.evaluate(x);
        }
        return x;
    }
}
// 定义多项式函数接口
interface f {
    BigDecimal evaluate(BigDecimal x);
}